package com.violet.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;

public class IdUtils {

    // 使用原子整数来记录同一时间戳下的序号，保证并发安全
    private static final AtomicInteger COUNTER = new AtomicInteger(0);

    private static String generateUniqueId() {
        // 获取当前年月日，格式为 yyyyMMdd
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String currentDate = sdf.format(new Date());
        // 获取当前时间戳（精确到毫秒），并转换为字符串
        long timestamp = System.currentTimeMillis();
        String timeStampStr = String.valueOf(timestamp);
        // 获取UUID字符串
        String uuid = UUID.randomUUID().toString().replace("-", "");
        // 获取当前时间戳下的自增序号，格式化为固定长度字符串（这里设置为4位，可根据实际情况调整，确保整体凑够28位）
        String counterStr = String.format("%04d", COUNTER.getAndIncrement());
        // 组合上述信息，同时合理规划各部分长度，确保最终凑够28位
        StringBuilder combined = new StringBuilder();
        combined.append(currentDate);  // 占8位
        combined.append(timeStampStr.substring(timeStampStr.length() - 10));  // 取时间戳后10位，占10位
        combined.append(counterStr);   // 占4位
        combined.append(uuid, 0, 6);  // 取UUID的前6位，占6位
        return combined.toString();
    }

    /**
     * @param prefix 前缀
     * @return 生成唯一ID：{prefix + 年月日 + 时间戳 + UUID}，total length: 17
     */
    public static String getId(String prefix) {
        return prefix + generateUniqueId();
    }
}
